﻿#define  _CRT_SECURE_NO_WARNINGS 1
//2.二分查找
//在⼀个升序的数组中查找指定的数字n，很容易想到的⽅法就是遍历数组，但是这种⽅法效率⽐较低。
//⽐如我买了⼀双鞋，你好奇问我多少钱，我说不超过300元。你还是好奇，你想知道到底多少，我就让
//你猜，你会怎么猜？你会1，2，3，4...这样猜吗？显然很慢；⼀般你都会猜中间数字，⽐如：150，然
//后看⼤了还是⼩了，这就是⼆分查找，也叫折半查找。
//二分查重数据的前提是数据是有序的
#include <stdio.h>
//int main()
//{
//	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
//	int k = 0;
//	scanf("%d", &k);//输入要查找的值，假设是7
//	//第一步找出数组的中间元素  
//	// 第一个下标（左下标）＋最后一个下标（右下标）然后/2 ：（0+9）/2=4 
//	// 那么就找下标为4的那个数
//	//即找5  然后5＜7   所以新的查找范围就是6 7 8 9 10  此时左下标+右下标然后/2
//	//（5+9）/2=7 那么就找到下标为7的数，也就是8  然后8>7
//	//所以新的范围是6 7  此时（5+6）/2=5  5作为下标找到6 
//	//6<7  所以新的范围是7      左下标6右下标6  （6+6）/2=6 所以找到了7
//	// 总的来说就是确定左下标left 右下标right  找到中间元素mid
//
//	int left = 0;
//	//int right = 9;//这样不好，如何数组元素个数发生改变我们又要换
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	int right = sz - 1;
//
//    //这就是一次完美的二分查找的过程，把它写到循环里
//	//int mid = (left + right) / 2;
//
//	//if (arr[mid] < k)    //数组的中间元素和查找的数比较  小  所以修正左下标
//	//{
//	//	left = mid + 1;
//	//}
//	//else if (arr[mid] > k)
//	//{
//	//	right = mid - 1;  //  数组中间元素比查找的数 大 所以修正右下标
//	//}
//	//else
//	//{
//	//	printf("找到了，下标是%d\n", mid);
//	//	break;  //找到了就跳出循环
//	//}
//	while (left <= right)  //循环进行的判断条件:左下标<=右下标的时候 
//		//这里不能写1因为如果找不到就会死循环了
//		//=的时候他们指向同一个元素，这个元素可能就是我要找的
//	{
//		int mid = (left + right) / 2;  //有些bug如下
//
//		if (arr[mid] < k)    //数组的中间元素和查找的数比较  小  所以修正左下标
//		{
//			left = mid + 1;
//		}
//		else if (arr[mid] > k)
//		{
//			right = mid - 1;  //  数组中间元素比查找的数 大 所以修正右下标
//		}
//		else
//		{
//			printf("找到了，下标是%d\n", mid);
//			break;  //找到了就跳出循环
//		}
//	}
//	if (left > right)
//	{
//		printf("找不到\n");
//	}
//	return 0;
//}
//2147483647 整型的最大值
//int main()
//{
//	//int a = INT_MAX;
//	int a = 2147483646;
//	int b = 2147483646;
//	int avg = (a + b) / 2;
//	printf("%d\n", avg);//发现结果是-2 a+b已经超出了
//	//那我们应该如何求呢？
//
//	return 0;
//}


//int main()
//{
//	int a = 2147483646;
//	int b = 2147483646;
//	int avg = a + (b - a) / 2;  //思考 其中一个加上 另一个数于它的差值除以2就是平均数
//	//这样就不会值溢出了
//	//这样就可以避免这种情况
//	printf("%d\n", avg);
//	return 0;
//}

//c语言的代码（程序）就是函数组成
//其实在C语⾔也引⼊函数（function）的概念，有些翻译为：⼦程序，⼦程序这种翻译更加准确⼀些。
//C语⾔中的函数就是⼀个完成某项特定的任务的⼀⼩段代码。这段代码是有特殊的写法和调⽤⽅法的。
//C语⾔的程序其实是由⽆数个⼩的函数组合⽽成的，也可以说：⼀个⼤的计算任务可以分解成若⼲个较
//⼩的函数（对应较⼩的任务）完成。同时⼀个函数如果能完成某项特定任务的话，这个函数也是可以
//复⽤的，提升了开发软件的效率。
//在C语⾔中我们⼀般会⻅到两类函数：
//• 库函数
//• ⾃定义函数
#include <math.h>
//int main()
//{
//	double r = sqrt(16);
//	printf("%lf\n", r);
//	return 0;
//
//}

//其实自定义函数和库函数是一样的，形式如下：
//ret_type fun_name(形式参数)
// {
// 
// }
// 
// 其中ret_type是函数返回类型 fun_name是函数名  括号中放的是形式参数 {}括起来的是函数体

